package ck.springboot.basic.service;

import org.springframework.data.redis.connection.RedisStringCommands;

/**
 * @Classname RedisService
 * @Description redis操作Service,对象和数组都以json形式进行存储
 * @Date 2020/7/9 20:17
 * @Created by lpc
 */
public interface RedisService {


    /**
     * 存储数据
     */
    void set(String key, String value);

    /**
     * 获取数据
     */
    String get(String key);

    /**
     * 设置超期时间
     */
    boolean expire(String key, long expire);

    /**
     * 删除数据
     */
    void remove(String key);

    /**
     * 自增操作
     * @param delta 自增步长
     */
    Long increment(String key, long delta);


    /**
     * 对bitmap操作
     */

    /**
     * 将指定parameter值设置成 1，{@param parameter} 会经过hash计算进行存储
     * @param key
     * @param parameter 要设置偏移的key,该key会经过hash运算
     * @param value true:该位设置为1，否则设置为0
     * @return 返回设置该value之前的值
     */
    boolean setBit(String key , String parameter , boolean value);

    /**
     * 将指定parameter的值设置为0，{@param parameter}会经过hash计算进行存储。
     * @param key
     * @param parameter 要移除偏移的key，该key会经过hash运算
     * @return 若偏移位上的值为1，那么返回true。
     */
    boolean getBit(String key, String parameter);

    /**
     * 将指定offset偏移量的值设置为1；
     * @param key
     * @param offset 指定的偏移量
     * @param value true：即该位设置为1，否则设置为0
     * @return 返回设置该value之前的值
     */
    boolean setBit(String key, Long offset, boolean value);

    /**
     * 将指定offset偏移量的值设置为0；
     * @param key
     * @param offset 指定的偏移量。
     * @return 若偏移位上的值为1，那么返回true。
     */
    boolean getBit(String key, long offset);

    /**
     * 统计对应的bitmap上value为1的数量
     * @param key bitmap的key
     * @return value等于1的数量
     */
    Long bitCount(String key);

    /**
     * 统计指定范围中value为1的数量
     * @param key  bitMap中的key
     * @param start 该参数的单位是byte（1byte=8bit），{@code setBit(key,7,true);}进行存储时，单位是bit。那么只需要统计[0,1]便可以统计到上述set的值。
     * @param end 该参数的单位是byte。
     * @return 在指定范围[start*8,end*8]内所有value=1的数量
     */
    Long bitCount(String key,int start ,int end);



/**
 * 对一个或多个保存二进制的字符串key进行元操作，并将结果保存到saveKey上。
 * <p>
 * bitop and saveKey key [key...]，对一个或多个key逻辑并，结果保存到saveKey。
 * bitop or saveKey key [key...]，对一个或多个key逻辑或，结果保存到saveKey。
 * bitop xor saveKey key [key...]，对一个或多个key逻辑异或，结果保存到saveKey。
 * bitop xor saveKey key，对一个或多个key逻辑非，结果保存到saveKey。
 * <p>
 *
 * @param op      元操作类型；
 * @param saveKey 元操作后将结果保存到saveKey所在的结构中。
 * @param desKey  需要进行元操作的类型。
 * @return 1：返回元操作值。
 */
    Long bitTop(RedisStringCommands.BitOperation op, String saveKey, String... desKey);


    /**
     * 对一个或多个保存二进制的字符串key进行元操作，并将结果保存到saveKey上，并返回统计之后的结果。
     *
     * @param op      元操作类型；
     * @param saveKey 元操作后将结果保存到saveKey所在的结构中。
     * @param desKey  需要进行元操作的类型。
     * @return 返回saveKey结构上value=1的所有数量值。
     */
     Long bitTopResult(RedisStringCommands.BitOperation op, String saveKey, String... desKey) ;












}
